// import { Component, v2, Vec2, view, _decorator } from 'cc';
// import { app } from '../../app';
// import ItemHelper from '../common/ItemHelper';
// import QuadTree from '../common/QuadTree ';
// import { JsonModule } from '../conf/ClientConfigMgr';
// import Util from '../core/utils/Util';
// import Enemy from '../logics/Enemy';
// const { ccclass, property } = _decorator;

// interface IWaveData { //波次数据
//     id: number;
//     tm: number;
//     curTm: number;
// }


// interface IFbMonsterData { //需要创建怪物数据
//     pos: Vec2;
//     mid: number;
//     fid: number;
// }



// @ccclass('NewComponent')
// export class NewComponent extends Component {
//     private _enemyList: Enemy[] = null;

//     private _target: any = null;

//     private _fbArr: IWaveData[] = [];

//     private _cTime: number;
//     private _createList: IFbMonsterData[] = null;  //创建怪物列表

//     public checkEnemys: Enemy[] = [];
//     public quadTree: QuadTree = null;

//     private _wHalf: number = 0;
//     private _hHalf: number = 0;

//     initial() {

//         this._target = app.gameMgr.camera;
//         this._fbArr = [];
//         this._enemyList = [];
//         this._createList = [];
//         this._cTime = 0;

//         const size = view.getVisibleSize();
//         this._wHalf = size.width * 0.25 + 50;
//         this._hHalf = size.height * 0.25 + 50;

//         // if(ItemHelper.isDoubleMode()){
//         //     this.startWaves();
//         // }
//     }

//     startWaves() {
//         let cfg;
//         if (ItemHelper.isDoubleMode()) { //双人模式
//             cfg = app.confMgr.conf.fbconfig.getConfById(420001);
//         } else {    //单人模式

//             if (app.dataMgr.battleData.player1.trySuperSkill != null) {  //超武试用
//                 cfg = app.confMgr.conf.fbconfig.getConfById(410001);
//             } else {
//                 let fbConfs = app.confMgr.conf.fbconfig.getConfArr();
//                 cfg = fbConfs[0];
//             }
//         }

//         this._fbArr.push({ id: cfg.id, tm: cfg.fresh_cd, curTm: 0 });
//     }

//     gameUpdate(dt) {

//         // this._fbArr.forEach(f => {
//         //     f.curTm += dt;
//         // })
//         // for (let i = 0; i < this._fbArr.length; i++) {
//         //     let fb = this._fbArr[i];
//         //     if (fb.curTm > fb.tm) {
//         //         ArrayUtil.fastRemoveAt(this._fbArr, i);
//         //         this.freshCreateWave(fb);
//         //         break;
//         //     }
//         // }

//         let rect = view.getVisibleSize() // app.gameMgr.camera.getViewRect();
//         this.quadTree = new QuadTree(rect, 0);

//         this.checkEnemys = [];
//         this._enemyList.forEach(enemy => {
//             enemy.gameUpdate(dt);

//             if (!enemy.isDie && enemy.inView) {
//                 this.checkEnemys.push(enemy);
//                 this.quadTree.insert(enemy.getCollisionData());
//             }

//         })
//         // console.log('this._enemyList---------',this._enemyList.length,this.checkEnemys.length,this.quadTree.objLen())

//         //逐帧创建怪物
//         if (this._createList.length > 0) {
//             this._cTime += dt;
//             if (this._cTime >= 0.01) {
//                 this._cTime = 0;
//                 this.createEnemy();
//             }
//         }
//     }

//     protected onEnable(): void {
//         // systemEvent.on(EventName.gm_create_enemy, this.gmCreateEnemy, this);
//     }

//     protected onDisable(): void {
//         // systemEvent.off(EventName.gm_create_enemy, this.gmCreateEnemy, this);
//     }

//     gmCreateEnemy(enemyId, count, type) {
//         console.log("gmCreateEnemy :: ", enemyId, count, type)
//         let obj = Object.create(null);
//         obj.id = Math.random() > 0.5 ? 400001 : 400001;
//         obj.monster_id = enemyId;
//         obj.monster_num = count;
//         obj.fresh_site = type;
//         if (type == 20) {
//             //椭圆
//             this.initEllipseEnemys(obj);
//         } else if (type == 21) {
//             //生成圆形
//             this.initCircleEnemy(obj);
//         }
//         else {
//             //范围随机生成
//             this.initEnemys(obj);
//         }
//     }


//     /**触发去创建一波 */
//     freshCreateWave(fb: { id: number, tm: number, curTm: number }) {

//         // let fbconf = app.confMgr.conf.fbconfig.getConfById(fb.id);
//         // if (!fbconf) {
//         //     return;
//         // }
//         // let nextIdStr: string = fbconf.next_id;
//         // if (nextIdStr) {
//         //     let ids = Util.splitNumber(nextIdStr);
//         //     for (let i = 0; i < ids.length; i++) {
//         //         let conf = app.confMgr.conf.fbconfig.getConfById(ids[i]);
//         //         this._fbArr.push({ id: conf.id, tm: conf.fresh_cd, curTm: 0 });
//         //     }
//         // }
//         // console.log('timeToFreshWave--------', fbconf.id)

//         // if (fbconf.fresh_site == 20) {
//         //     this.initEllipseEnemys(fbconf);
//         // } else {
//         //     this.initEnemys(fbconf);
//         // }
//     }
//     /**椭圆包围圈 */
//     private initEllipseEnemys(fbconf: JsonModule.IFbconfig) {
//         const mIds = Util.splitNumber(fbconf.monster_id);
//         const nums = Util.splitNumber(fbconf.monster_num);
//         let midArr: number[] = [];
//         for (let i = 0; i < nums.length; i++) {
//             let l = nums[i], mid = mIds[i];
//             for (let j = 0; j < l; j++) {
//                 midArr.push(mid);
//             }
//         }
//         let len = midArr.length;

//         var w = this._wHalf;//椭圆长
//         var h = this._hHalf; //椭圆高
//         var angle = 360 / len;
//         var x, y;
//         const point = this._target.node.getPosition();
//         for (let i = 0; i < len; i++) {
//             // Mathf.Deg2Rad 单位角度的弧 相当于 1° 的弧度
//             x = w * Math.cos(i * (angle / 180) * Math.PI);
//             y = h * Math.sin(i * (angle / 180) * Math.PI);


//             let obj: IFbMonsterData = Object.create(null);
//             obj.pos = v2(x + point.x, y + point.y);
//             obj.mid = midArr[i];
//             obj.fid = fbconf.id;
//             this._createList.push(obj)
//         }
//     }
//     /**圆形包围圈 */
//     private initCircleEnemy(fbconf: JsonModule.IFbconfig) {
//         const mIds = Util.splitNumber(fbconf.monster_id);
//         const nums = Util.splitNumber(fbconf.monster_num);
//         let midArr: number[] = [];
//         for (let i = 0; i < nums.length; i++) {
//             let l = nums[i], mid = mIds[i];
//             for (let j = 0; j < l; j++) {
//                 midArr.push(mid);
//             }
//         }
//         let len = midArr.length;
//         const point = this._target.node.getPosition();
//         const averageAngle = 360 / len;
//         let a = 0;
//         for (let i = 0; i < len; i++) {
//             let r = this._hHalf + 10;//半径
//             let pos = v2();
//             pos.x = point.x + Math.sin(a * Math.PI / 180) * r;
//             pos.y = point.y + Math.cos(a * Math.PI / 180) * r;
//             a += averageAngle;
//             let obj: IFbMonsterData = Object.create(null);
//             obj.pos = pos;
//             obj.mid = midArr[i];
//             obj.fid = fbconf.id;
//             this._createList.push(obj)
//         }
//     }
//     /**方形 随机生成怪物 */
//     private initEnemys(fbconf: JsonModule.IFbconfig) {

//         const mIds = Util.splitNumber(fbconf.monster_id);
//         const nums = Util.splitNumber(fbconf.monster_num);
//         let midArr: number[] = [];
//         for (let i = 0; i < nums.length; i++) {
//             let l = nums[i], mid = mIds[i];
//             for (let j = 0; j < l; j++) {
//                 midArr.push(mid);
//             }
//         }
//         //计算四边平均怪物数量
//         let total = midArr.length;
//         let m_idx: number = 0;
//         const means = [];
//         if (total < 4) {
//             for (let i = 0; i < total; i++) {
//                 means.push(1);
//             }
//         } else {
//             const mean = Math.floor(total / 4);
//             for (let i = 0; i < 4; i++) {
//                 total -= mean;
//                 means.push(mean);
//             }
//             for (let i = 0; i < total; i++) {
//                 means[i] += 1;
//             }
//         }

//         const point = this._target.node.getPosition();
//         const state = fbconf.fresh_site > 0 ? fbconf.fresh_site : 1;
//         const xMin = point.x - this._wHalf / state;// / 1//Util.randomNumber(1,fbconf.fresh_site);
//         const xMax = point.x + this._wHalf / state;// / 1//Util.randomNumber(1,fbconf.fresh_site);
//         const yMin = point.y - this._hHalf / state;// / 1//Util.randomNumber(1,fbconf.fresh_site);
//         const yMax = point.y + this._hHalf / state;// / 1//Util.randomNumber(1,fbconf.fresh_site);

//         const tmpRects = [
//             new Vec2(xMin, yMin),
//             new Vec2(xMin, yMax),
//             new Vec2(xMax, yMax),
//             new Vec2(xMax, yMin)];
//         for (let i = 0; i < means.length; i++) {
//             const num = means[i];
//             let pjs = i % 2 == 0 ? (yMax - yMin) : (xMax - xMin);
//             pjs /= num;

//             for (let j = 0; j < num; j++) {
//                 const val = j * pjs;
//                 const pos: Vec2 = tmpRects[i].clone();
//                 if (i == 0) {
//                     pos.y = Util.randomNumber(pos.y, pos.y + val);
//                     if (state != 1) {
//                         pos.x = Util.randomNumber(pos.x, pos.x + val)
//                     }
//                     // pos.x /= fbconf.fresh_site;
//                     // if(num > 4) {
//                     //     pos.x -= Math.abs(Util.randomNumber(pos.x, pos.x - 100));
//                     // }
//                 } else if (i == 1) {
//                     pos.x = Util.randomNumber(pos.x, pos.x + val);
//                     if (state != 1)
//                         pos.y = Util.randomNumber(pos.y, pos.y + val);
//                     // pos.y /= fbconf.fresh_site;
//                     // if(num > 4){
//                     //     pos.y += Util.randomNumber(pos.y, pos.y + 100);
//                     // }
//                 } else if (i == 2) {
//                     pos.y = Util.randomNumber(pos.y, pos.y - val);
//                     if (state != 1)
//                         pos.x = Util.randomNumber(pos.x, pos.x - val);
//                     // pos.x /= fbconf.fresh_site;
//                     // if(num > 4){
//                     //     pos.x += Util.randomNumber(pos.x, pos.x + 100);
//                     // }
//                 } else {
//                     pos.x = Util.randomNumber(pos.x, pos.x - val);
//                     if (state != 1)
//                         pos.y = Util.randomNumber(pos.y, pos.y - val);
//                     // pos.x -= val;
//                     // pos.y /= fbconf.fresh_site;
//                     // if(num > 4){
//                     //     pos.y -= Math.abs(Util.randomNumber(pos.y, pos.y - 100));
//                     // }
//                 }

//                 let obj: IFbMonsterData = Object.create(null);
//                 obj.pos = pos;
//                 obj.mid = midArr[m_idx++];
//                 obj.fid = fbconf.id;
//                 this._createList.push(obj);
//             }
//         }

//     }
//     /**方形 队列生成怪物 */
//     private initEnemy(fbconf: JsonModule.IFbconfig) {

//         const mIds = Util.splitNumber(fbconf.monster_id);
//         const nums = Util.splitNumber(fbconf.monster_num);
//         let midArr: number[] = [];
//         for (let i = 0; i < nums.length; i++) {
//             let l = nums[i], mid = mIds[i];
//             for (let j = 0; j < l; j++) {
//                 midArr.push(mid);
//             }
//         }
//         //计算四边平均怪物数量
//         let total = midArr.length;
//         let m_idx: number = 0;
//         const means = [];
//         if (total < 4) {
//             for (let i = 0; i < total; i++) {
//                 means.push(1);
//             }
//         } else {
//             const mean = Math.floor(total / 4);
//             for (let i = 0; i < 4; i++) {
//                 total -= mean;
//                 means.push(mean);
//             }
//             for (let i = 0; i < total; i++) {
//                 means[i] += 1;
//             }
//         }

//         const point = this._target.node.getPosition();
//         const xMin = point.x - this._wHalf;
//         const xMax = point.x + this._wHalf;
//         const yMin = point.y - this._hHalf;
//         const yMax = point.y + this._hHalf;
//         const tmpRects = [
//             new Vec2(xMin, yMin),
//             new Vec2(xMin, yMax),
//             new Vec2(xMax, yMax),
//             new Vec2(xMax, yMin)];
//         for (let i = 0; i < means.length; i++) {
//             const num = means[i];
//             let pjs = i % 2 == 0 ? (yMax - yMin) : (xMax - xMin);
//             pjs /= num;

//             for (let j = 0; j < num; j++) {
//                 const val = j * pjs;
//                 const pos: Vec2 = tmpRects[i].clone();
//                 if (i == 0) {
//                     pos.y += val;
//                     if (num > 4) {
//                         pos.x -= Math.abs(Util.randomNumber(pos.x, pos.x - 100));
//                     }
//                 } else if (i == 1) {
//                     pos.x += val;
//                     if (num > 4) {
//                         pos.y += Util.randomNumber(pos.y, pos.y + 100);
//                     }
//                 } else if (i == 2) {
//                     pos.y -= val;
//                     if (num > 4) {
//                         pos.x += Util.randomNumber(pos.x, pos.x + 100);
//                     }
//                 } else {
//                     pos.x -= val;
//                     if (num > 4) {
//                         pos.y -= Math.abs(Util.randomNumber(pos.y, pos.y - 100));
//                     }
//                 }

//                 let obj: IFbMonsterData = Object.create(null);
//                 obj.pos = pos;
//                 obj.mid = midArr[m_idx++];
//                 obj.fid = fbconf.id;
//                 this._createList.push(obj);
//             }
//         }

//     }
//     /**创建一个怪物 */
//     private createEnemy() {
//         // let cmonster: IFbMonsterData = this._createList.shift();
//         // let mCfg = app.confMgr.conf.monster.getConfById(cmonster.mid);

//         // resLoader.loadRes<Prefab>(BoundNameEnum.subBattle, `monster/${mCfg.model_id}`).then(prefab => {
//         //     let node: Node = instantiate(prefab);
//         //     this.node.addChild(node);
//         //     node.setPosition(cmonster.pos);
//         //     let enemy: Enemy = node.getComponent(Enemy);

//         //     enemy.initial(this.findTarget(cmonster.pos), cmonster);
//         //     this._enemyList.push(enemy);
//         // })
//     }

//     /**找玩家中一个 */
//     findTarget(pos: Vec2) {
//         // let p1 = app.gameMgr.player, p2 = app.gameMgr.player2;
//         // if (!p2) return p1;
//         // return Math.abs(pos.x - p1.node.x) < Math.abs(pos.x - p2.node.x) ? p1 : p2;
//     }

//     public getEnemyList() {
//         return this._enemyList;
//     }

//     /** 怪物回收*/
//     public recycleEnemy(enemy: Enemy) {
//         for (let i = this._enemyList.length - 1; i >= 0; i--) {
//             const tmpEnemy = this._enemyList[i];
//             if (tmpEnemy == enemy) {
//                 enemy.node.destroy();
//                 this._enemyList.splice(i, 1);
//                 break;
//             }
//         }

//         //没有怪物了，但是还未到刷怪时间，强制下一波
//         if (this._enemyList.length == 0 && this._fbArr.length > 0) {
//             this._fbArr.sort((fa, fb) => {
//                 return (fa.tm - fa.curTm) - (fb.tm - fa.curTm);
//             })
//             let fb = this._fbArr[0];
//             fb.curTm = fb.tm;
//         }
//     }
// }


